﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.Service.Common;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Infra.Service.Validation;

namespace Sinacor.Servico.Bovespa.Cliente.BusinessLogic
{
    /// <summary>
    /// Tipo de Conta
    /// </summary>
    public class TipoConta : BaseBusinessLogic
    {
        #region Construtor
        /// <summary>
        /// Construtor Padrão
        /// </summary>
        public TipoConta()
            : base()
        { }
        #endregion

        #region Métodos
        /// <summary>
        /// Alterar Tipo de Conta
        /// </summary>
        /// <param name="request">Parametro para alteração</param>
        public void AlterarTipoConta(BusinessEntity.TipoConta request) 
        {
            if (request == null)
                throw new BusinessException(109347);

            SinacorValidation validation = new SinacorValidation();
            validation.Validate<BusinessEntity.TipoConta>(request);

            new ResourceAccess.TipoConta().AlterarTipoConta(request);
   
        }

        /// <summary>
        /// Alteração dos Tipos de Conta
        /// </summary>
        /// <param name="request">Lista de Tipos de Conta</param>
        public void AlterarTiposConta(List<BusinessEntity.TipoConta> request) 
        {
            foreach (BusinessEntity.TipoConta tipoConta in request) 
            {
                this.AlterarTipoConta(tipoConta);
            }
        }

        /// <summary>
        /// Consultar Tipos de Conta
        /// </summary>
        /// <param name="request">Filtro de Tipos de Conta</param>
        /// <returns>Lista de Tipos de Conta</returns>
        public List<BusinessEntity.TipoConta> ConsultarTiposConta(BusinessEntity.Parameter.FiltroTipoConta request)
        {
            return new ResourceAccess.TipoConta().ConsultarTiposConta(request);
        }

        /// <summary>
        /// Excluir Tipo de Conta
        /// </summary>
        /// <param name="request">Filtro de Codigo de Cliente</param>
        public void ExcluirTipoConta(BusinessEntity.Parameter.FiltroCodigoCliente request) 
        {
            new ResourceAccess.TipoConta().ExcluirTipoConta(request);
        }

        /// <summary>
        /// Excluir Lista de Tipos de Conta
        /// </summary>
        /// <param name="request">Lista de Tipos de Conta</param>
        public void ExcluirTiposConta(List<BusinessEntity.Parameter.FiltroCodigoCliente> request) 
        {
            foreach (BusinessEntity.Parameter.FiltroCodigoCliente filtroCodigoCliente in request)
            {
                this.ExcluirTipoConta(filtroCodigoCliente);
            }
        }
        /// <summary>
        /// Executa as transações de Incluir, Alterar e Excluir os Tipos de Conta
        /// </summary>
        /// <param name="listaInclusao">Lista de Inclusão</param>
        /// <param name="listaAlteracao">Lista de Alteração</param>
        /// <param name="listaExclusao">Lista de Exclusão</param>
        public void ExecutarTransacoes(List<BusinessEntity.TipoConta> listaInclusao, List<BusinessEntity.TipoConta> listaAlteracao, List<BusinessEntity.Parameter.FiltroCodigoCliente> listaExclusao) 
        {
            this.IncluirTiposConta(listaInclusao);
            this.AlterarTiposConta(listaAlteracao);
            this.ExcluirTiposConta(listaExclusao);
        }

        /// <summary>
        /// Incluir Tipo de Conta
        /// </summary>
        /// <param name="request">Tipo de Conta</param>
        public void IncluirTipoConta(BusinessEntity.TipoConta request)
        {
            if (request == null)
                throw new BusinessException(109342);

            this.ValidarTipoConta(request);

            BusinessEntity.Parameter.FiltroCodigoCliente filtro = new Sinacor.Servico.Bovespa.Cliente.BusinessEntity.Parameter.FiltroCodigoCliente();
            filtro.Codigo = request.CodigoCliente.Value;

            if (this.ValidarExistenciaTipoConta(filtro))
                throw new BusinessException(109346);

            new ResourceAccess.TipoConta().IncluirTipoConta(request);
        }

        /// <summary>
        /// Incluir uma lista de Tipos de Contas
        /// </summary>
        /// <param name="request">Lista de Tipos de Conta</param>
        public void IncluirTiposConta(List<BusinessEntity.TipoConta> request) 
        {
            foreach (BusinessEntity.TipoConta tipoConta in request)
            {
                this.IncluirTipoConta(tipoConta);
            }
        }

        /// <summary>
        /// Validação da Existencia de um Tipo de Conta
        /// </summary>
        /// <param name="request">Cliente</param>
        /// <returns>Se tem conta com o codigo do Cliente</returns>
        private bool ValidarExistenciaTipoConta(BusinessEntity.Parameter.FiltroCodigoCliente request) 
        {
            BusinessEntity.Parameter.FiltroTipoConta filtroTipoConta = new Sinacor.Servico.Bovespa.Cliente.BusinessEntity.Parameter.FiltroTipoConta();
            filtroTipoConta.CodigoCliente = request.Codigo;
            return (this.ConsultarTiposConta(filtroTipoConta).Count > 0);
        }

        /// <summary>
        /// Validar Tipo de Conta
        /// </summary>
        /// <param name="request">Tipo de Conta</param>
        private void ValidarTipoConta(BusinessEntity.TipoConta request) 
        {
            SinacorValidation validation = new SinacorValidation();
            validation.Validate<BusinessEntity.TipoConta>(request);

            BusinessEntity.Parameter.FiltroCodigoCliente filtro = new Sinacor.Servico.Bovespa.Cliente.BusinessEntity.Parameter.FiltroCodigoCliente();
            filtro.Codigo = request.CodigoCliente.Value;

            Cliente blCliente = new Cliente();
            blCliente.ValidarExistenciaCliente(filtro);

        }
        #endregion
    }
}
